# 封装装饰器，实现对token进行验证，以及进一步对管理员权限进行验证
from flask import request, g
from flask_restful import abort, reqparse

from App.apis.admin.model_utils import get_admin_user
from App.ext import cache

# 方案一：使用装饰器的形式
def login_required(fun):
    def wrapper(*args , **kwargs):
        token = request.args.get("token")

        if not token:
            abort(401 , msg = "用户未登录")
        user_id = cache.get(token)

        # 这里给了一个token来源的判断
        if not token.startswith('admin_user'):      # 判断token的前缀是不是这一端的
            abort(401 , msg = '没有权限')

        if not user_id:
            abort(401 , msg = '用户已掉线，请重新登陆')
        user = get_admin_user(user_id)

        if not user:
            abort(401 , msg = '用户已掉线，请重新登陆')

        #顺便把用户和token带到全局变量给其他地方引用
        g.user = user
        g.token = token

        return fun(*args , **kwargs)
    return wrapper

# 方案二：直接封装出一个函数来验证token
def is_token():
    token = request.args.get("token")

    if not token:
        abort(401, msg="用户未登录")
    user_id = cache.get(token)

    if not user_id:
        abort(401, msg='用户已掉线，请重新登陆')
    user = get_admin_user(user_id)

    if not user:
        abort(401, msg='用户已掉线，请重新登陆')

    # 顺便把用户和token带到全局变量给其他地方引用
    g.user = user
    g.token = token
    return user

# 因为要传参permission，所以比上面的情况多包了一层
def required_permission(permission):
    def required_permission_wrapper(fun):
        def wrapper(*args , **kwargs):
            user = is_token()
            # is_token()
            if not user.check_permission(permission):           # 这里用g.user或user都是可行的，因为is_token设置了返回值user可以不必用g.user
                abort(403 , msg = '没有权限')
            return fun(*args , **kwargs)
        return wrapper
    return required_permission_wrapper



